package com.kexio.user.entity;

import java.util.List;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.kexio.common.entity.BaseEntity;

/**
 * 角色实体类
 * 
 * 对应数据库表 sys_role
 * 存储系统角色信息和数据权限范围配置
 * 
 * @author Kexio Team
 * @since 1.0.0
 */
@TableName("sys_role")
public class Role extends BaseEntity {
    
    /**
     * 角色ID（主键）
     */
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    private String id;
    
    /**
     * 角色编码（在租户内唯一）
     */
    @TableField("code")
    private String code;
    
    /**
     * 角色名称
     */
    @TableField("name")
    private String name;
    
    /**
     * 数据权限范围：ALL-全部/DEPT-部门/DEPT_AND_CHILD-部门及下级/SELF-个人/CUSTOM-自定义
     */
    @TableField("data_scope")
    private String dataScope;
    
    /**
     * 自定义部门ID列表（JSON格式）
     */
    @TableField("custom_dept_ids")
    private String customDeptIds;
    
    /**
     * 角色描述
     */
    @TableField("description")
    private String description;
    
    /**
     * 状态：1-启用，0-禁用
     */
    @TableField("status")
    private Integer status;
    
    /**
     * 排序号
     */
    @TableField("order_no")
    private Integer orderNo;
    
    
    // ==================== 非数据库字段（用于关联查询） ====================
    
    /**
     * 角色关联的权限列表（非数据库字段）
     */
    @TableField(exist = false)
    private List<Permission> permissions;
    
    /**
     * 自定义部门ID列表（解析后的列表）
     */
    @TableField(exist = false)
    private List<String> customDeptIdList;
    
    /**
     * 删除标记
     * 
     * 重写父类字段以启用逻辑删除。
     * 0表示未删除，1表示已删除。
     */
    @TableField(value = "deleted", fill = FieldFill.INSERT)
    @TableLogic(value = "0", delval = "1")
    @JsonIgnore
    private Integer deleted;
    
    // ==================== 便捷方法 ====================
    
    /**
     * 判断角色是否启用
     */
    public boolean isEnabled() {
        return status != null && status == 1;
    }
    
    /**
     * 判断是否为超级管理员角色
     */
    public boolean isSuperAdmin() {
        return "SUPER_ADMIN".equals(this.code);
    }
    
    /**
     * 判断是否有全部数据权限
     */
    public boolean hasAllDataScope() {
        return "ALL".equals(this.dataScope);
    }
    
    /**
     * 判断是否为部门数据权限
     */
    public boolean isDeptScope() {
        return "DEPT".equals(this.dataScope);
    }
    
    /**
     * 判断是否为部门及下级数据权限
     */
    public boolean isDeptAndChildScope() {
        return "DEPT_AND_CHILD".equals(this.dataScope);
    }
    
    /**
     * 判断是否为个人数据权限
     */
    public boolean isSelfScope() {
        return "SELF".equals(this.dataScope);
    }
    
    /**
     * 判断是否为自定义数据权限
     */
    public boolean isCustomScope() {
        return "CUSTOM".equals(this.dataScope);
    }
    
    // ==================== Getter/Setter ====================
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
    
    public String getCode() {
        return code;
    }
    
    public void setCode(String code) {
        this.code = code;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getDataScope() {
        return dataScope;
    }
    
    public void setDataScope(String dataScope) {
        this.dataScope = dataScope;
    }
    
    public String getCustomDeptIds() {
        return customDeptIds;
    }
    
    public void setCustomDeptIds(String customDeptIds) {
        this.customDeptIds = customDeptIds;
    }
    
    public String getDescription() {
        return description;
    }
    
    public void setDescription(String description) {
        this.description = description;
    }
    
    public Integer getStatus() {
        return status;
    }
    
    public void setStatus(Integer status) {
        this.status = status;
    }
    
    public Integer getOrderNo() {
        return orderNo;
    }
    
    public void setOrderNo(Integer orderNo) {
        this.orderNo = orderNo;
    }
    
    
    public List<Permission> getPermissions() {
        return permissions;
    }
    
    public void setPermissions(List<Permission> permissions) {
        this.permissions = permissions;
    }
    
    public List<String> getCustomDeptIdList() {
        return customDeptIdList;
    }
    
    public void setCustomDeptIdList(List<String> customDeptIdList) {
        this.customDeptIdList = customDeptIdList;
    }
    
    @Override
    public String toString() {
        return "Role{" +
                "code='" + code + '\'' +
                ", name='" + name + '\'' +
                ", dataScope='" + dataScope + '\'' +
                ", customDeptIds='" + customDeptIds + '\'' +
                ", description='" + description + '\'' +
                ", status=" + status +
                ", orderNo=" + orderNo +
                '}';
    }
}
